package com.javaweb.secondhand_trading.controller;

import com.javaweb.secondhand_trading.Dto.ProductDto;
import com.javaweb.secondhand_trading.common.BaseResponse;
import com.javaweb.secondhand_trading.entity.Product;
import com.javaweb.secondhand_trading.service.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.Resource;
import org.springframework.core.io.UrlResource;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;

/**
 * 商品控制器
 * 处理商品相关的HTTP请求
 */
@RestController // 标识为RESTful控制器
@RequestMapping("/api/products") // 基础请求路径
public class ProductController {

    @Autowired // 自动注入商品服务
    private ProductService productService;

    /**
     * 添加商品
     * @param productDto 商品信息DTO
     * @param images 商品图片文件列表（可选）
     * @return 包含新增商品的响应
     */
    @PostMapping
    public BaseResponse<Product> addProduct(
            @RequestPart ProductDto productDto,
            @RequestPart(required = false) List<MultipartFile> images) {
        Product product = productService.addProduct(productDto, images);
        return BaseResponse.success("商品上传成功", product);
    }

    /**
     * 更新商品信息
     * @param id 商品ID（路径变量）
     * @param productDto 更新后的商品信息DTO
     * @param images 新的商品图片列表（可选）
     * @return 包含更新后商品的响应
     */
    @PutMapping("/{id}")
    public BaseResponse<Product> updateProduct(
            @PathVariable Integer id,
            @RequestPart ProductDto productDto,
            @RequestPart(required = false) List<MultipartFile> images) {
        Product product = productService.updateProduct(id, productDto, images);
        return BaseResponse.success("商品修改成功", product);
    }

    /**
     * 删除商品
     * @param id 商品ID（路径变量）
     * @param userId 用户ID（请求参数，用于权限验证）
     * @return 操作结果响应
     */
    @DeleteMapping("/{id}")
    public BaseResponse<Void> deleteProduct(
            @PathVariable Integer id,
            @RequestParam Integer userId) {
        productService.deleteProduct(id, userId);
        return BaseResponse.success("商品删除成功", null);
    }

    /**
     * 获取单个商品详情
     * @param id 商品ID（路径变量）
     * @return 包含商品详情的响应
     */
    @GetMapping("/{id}")
    public BaseResponse<Product> getProduct(@PathVariable Integer id) {
        Product product = productService.getProductById(id);
        return BaseResponse.success("商品获取成功", product);
    }

    /**
     * 获取所有商品列表
     * @return 包含商品列表的响应
     */
    @GetMapping
    public BaseResponse<List<Product>> getAllProducts() {
        List<Product> products = productService.getAllProducts();
        return BaseResponse.success("商品列表获取成功", products);
    }

    /**
     * 获取指定用户的商品列表
     * @param userId 用户ID（请求参数）
     * @return 包含用户商品列表的响应
     */
    @GetMapping("/user")
    public BaseResponse<List<Product>> getUserProducts(@RequestParam Integer userId) {
        List<Product> products = productService.getUserProducts(userId);
        return BaseResponse.success("用户商品列表获取成功", products);
    }

    /**
     * 搜索商品
     * @param keyword 搜索关键词（请求参数）
     * @return 包含搜索结果列表的响应
     */
    @GetMapping("/search")
    public BaseResponse<List<Product>> searchProducts(@RequestParam String keyword) {
        List<Product> products = productService.searchProducts(keyword);
        return BaseResponse.success("搜索成功", products);
    }

    @GetMapping("/image/{filename}")
    public ResponseEntity<Resource> getImage(@PathVariable String filename) throws IOException {

        final String IMAGE_PATH = Paths.get(System.getProperty("user.dir"))
                .getParent()  // 获取上一级目录
                .resolve("Java_Basic/uploads")  // 拼接 uploads 目录
                .toString() + "/";  // 转换为字符串并添加斜杠
        System.out.println("图片路径："+IMAGE_PATH);

// 使用时
        Path filePath = Paths.get(IMAGE_PATH + filename);


        Resource resource = new UrlResource(filePath.toUri());
        return ResponseEntity.ok()
                .contentType(MediaType.IMAGE_JPEG)
                .body(resource);
    }
}